package im.eg.transaction.stuffs;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Component
public class UserService {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Autowired
    UserService userService;

    @Transactional
    public void one() {
        jdbcTemplate.execute("insert into t1 values (1,1,1)");
        userService.another();
        throw new NullPointerException();
    }

    /*
    1 - 代理对象获取Connection
    2 - 代理对象配置autocommit=false
    3 - 代理对象通过”保存的被代理对象“执行目标方法，即 target.one()
    4 - 进入 one() 后，
     4.1 - 第一条语句；
     4.2 - 第二条语句中 another 方法的调用者是”保存的被代理对象“，即 target.another()，所以 another() 方法执行前没有创建新事务
     4.3 - 抛异常
    5 - 代理对象发现抛出异常，回滚事务。至此，整个过程没有产生任何插入更改
     */

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void another() {
        jdbcTemplate.execute("insert into t1 values (2,2,2)");
    }

}
